package com.ruoyi.wechart.service.impl;

import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.domain.DeviceUserRegister;
import com.ruoyi.device.service.IDeviceUserRegisterService;
import com.ruoyi.framework.web.service.SysPermissionService;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.wechart.core.WxCore;
import com.ruoyi.wechart.dmain.WxLoginUser;
import com.ruoyi.wechart.service.IWxLoginService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

/**
 * 微信用户登录service接口实现类
 * @auth
 * @date
 */
@Slf4j
@Service
public class WxLoginServiceImpl implements IWxLoginService {

    @Value("${wechart.userType}")
    private String userType;

    @Autowired
    private WxCore wxCore;

    @Autowired
    private TokenService tokenService;

    @Autowired
    private ISysUserService userService;

    @Autowired
    private SysPermissionService permissionService;

    @Autowired
    private IDeviceUserRegisterService registerService;

    /**
     * 微信登录
     * @param code 小程序预发录code
     * @param userName 学号/工号/手机号
     * @param password 登录密码
     * @return
     */
    @Override
    public WxLoginUser login(String code, String userName, String password) {
        // 请求微信后台通过code获取openid
        String openid = wxCore.getOpenId(code);

        //String openid = code;

        //检测openid是否为空（注意：StringUtils类引用的事org.apache.commons.lang3中的类）
        if (StringUtils.isBlank(openid)) {
            // 获取不到openid，返回提示信息
            return new WxLoginUser(userName, "", -1, "获取openid失败");
        }
//       return  userLogin(userName,password,openid);


        //openid不为空则通过openid查询系统用户,qpp注册后审核通过的用户
        SysUser sysUser = userService.getUserByOpenid(openid);
        System.out.println("===============");
        System.out.println(sysUser);
        if (sysUser != null) {
            //系统用户不为空，直接返回微信登录相关信息
            return generateLoginUser(sysUser);
        }

        //openid查询不到系统用户则通过用户名密码再次查询系统用户
        sysUser = userService.getUserByName(userName);

        if (sysUser != null) {
            // 系统用户不为空，检查密码是否正确
            if (SecurityUtils.matchesPassword(password, sysUser.getPassword())) {
                // 密码正确，返回微信用户登录用户信息
                sysUser.setWxOpenid(openid);
                userService.updateUser(sysUser);
                return generateLoginUser(sysUser);
            } else {
                // 密码不正确，返回失败信息
                return new WxLoginUser(sysUser.getNickName(), sysUser.getDept().getDeptName(), -1, "用户名或密码不正确");
            }
        } else {
            // 系统用户为空，则查询已注册未审核的用户
            DeviceUserRegister registerUser = registerService.getRegisterByOpenId(openid);
            if (registerUser != null) {
                // 查询到已注册未审核用户，返回用户信息
                return generateLoginUser(registerUser);
            }
            // 通过openid未查询到已注册未审核用户，则通过用户名密码再次查询系统用户
            registerUser = registerService.getRegisterByName(userName);
            if (registerUser != null) {
                if (SecurityUtils.matchesPassword(password, registerUser.getRegPassword())) {
                    registerUser.setRegOpenid(openid);
                    registerService.editRegister(registerUser);
                    return generateLoginUser(registerUser);
                } else {
                    return new WxLoginUser(registerUser.getRegName(), registerUser.getRegDept(), -1, "用户名或密码不正确");
                }
            }
        }
        //默认返提示
        return new WxLoginUser(userName, "", -1, "用户名或密码不正确");
    }

    /**
     * 新用户注册
     * @param user
     * @return
     */
    @Override
    public int register(DeviceUserRegister user) {
        user.setCreateTime(DateUtils.getNowDate());
        user.setRegPassword(SecurityUtils.encryptPassword(user.getRegPassword()));
        return registerService.addRegister(user);
    }

    /**
     * 生成微信用户登录参数
     * @param user 系统用户
     * @return
     */
    private WxLoginUser generateLoginUser(SysUser user) {
        if (user.getStatus().equals("1")) {
            return new WxLoginUser(user.getNickName(), user.getDept().getDeptName(), 3, "该账号已被停用");
        } else {
            LoginUser loginUser = new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user));
            String token = tokenService.createToken(loginUser);
            return new WxLoginUser(user.getNickName(), user.getDept().getDeptName(), token);
        }
    }

    /**
     * 生成微信用户登录参数
     * @param user 申请注册用户
     * @return
     */
    private WxLoginUser generateLoginUser(DeviceUserRegister user) {
        if (user.getRegStatus() == 0) {
            return new WxLoginUser(user.getRegName(),user.getRegDept(), 1, "已注册，未审核");
        } else if (user.getRegStatus() == 2) {
            return new WxLoginUser(user.getRegName(),user.getRegDept(),  2, "审核未通过:" + user.getRegRemark());
        } else {
            return new WxLoginUser("",  "",  -1, "用户名或密码不正确");
        }
    }
    /**
     * 使用用户名密码openid登录
     * @param userName
     * @param password
     * @param openid
     * @return
     */
    private WxLoginUser userLogin(String userName,String password,String openid){
// 检查用户是否存在于系统用户表中
        SysUser sysUser = userService.getUserByName(userName);
        if (sysUser != null) {
            // 如果用户的 openid 匹配提供的 openid，则返回登录用户信息，无需检查密码
            if (openid.equals(sysUser.getWxOpenid())) {
                sysUser.setWxOpenid(openid);
                userService.updateUser(sysUser);
                return generateLoginUser(sysUser);
            }
            // 如果 openid 不匹配，则比对密码
            else if (SecurityUtils.matchesPassword(password, sysUser.getPassword())) {
                sysUser.setWxOpenid(openid);
                userService.updateUser(sysUser);
                return generateLoginUser(sysUser);
            }
        } else {
            // 如果用户不存在于系统用户表中，则检查注册用户表中是否存在
            DeviceUserRegister registerUser = registerService.getRegisterByName(userName);
            if (registerUser != null) {
                // 检查 openid 是否匹配
                if (openid.equals(registerUser.getRegOpenid())) {
                    return generateLoginUser(registerUser);
                }
                // 如果 openid 不匹配，则比对密码
                else if (SecurityUtils.matchesPassword(password, registerUser.getRegPassword())) {
                    registerUser.setRegOpenid(openid);
                    registerService.editRegister(registerUser);
                    return generateLoginUser(registerUser);
                }
            }
        }
        // 如果既不是系统用户也不是注册用户，返回登录失败
        return new WxLoginUser(userName,  "", -1,  "用户名或密码不正确");
    }

}

